package br.com.batista.goodbuy.controller;

import java.util.List;

import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;

import br.com.batista.goodbuy.dao.ProdutoDao;
import br.com.batista.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Put;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.view.Results;

@Resource
public class ProdutosController {
	
	private final ProdutoDao dao;
	private final Result result;
	private final Validator validator;
	
	public ProdutosController(ProdutoDao dao, Result result, Validator validator) {
		this.dao = dao;
		this.result = result;
		this.validator = validator;
	}
	
	@Get("/produtos/novo")
	public void formulario() {

	}
	
	public List<Produto> busca(String nome) {
		result.include(nome,"nome");
		return dao.busca(nome);
	}
	
	@Get("/produtos/{id}")
	public Produto edita(Long id) {
		return dao.carrega(id);
	}
	
	@Delete("/produtos/{id}")
	public void remove(Long id) {
		Produto produto = dao.carrega(id);
		dao.exclui(produto);
		result.redirectTo(this).lista();
	}
	
	@Put @Path("/produtos/{produto.id}")
	public void altera(Produto produto) {
		dao.altera(produto);
		System.out.println("alterado...");
		result.redirectTo(this).lista();
	}

	@Post("/produtos")
	public void adiciona(Produto produto) throws RollbackException, HeuristicMixedException, HeuristicRollbackException, SystemException {
		validator.validate(produto);
		validator.onErrorUsePageOf(ProdutosController.class).formulario();
		
		dao.salva(produto);
		result.redirectTo(this).lista();
	}
	
	@Get("/produtos")
	public List<Produto> lista() {
		return dao.listaTudo();
	}
	
	@Get("/produtos/busca.json")
	public void buscajSon(String q) {
		 result.use(Results.json()).withoutRoot().from(dao.busca(q)).exclude("id","descricao").serialize();
	}
	
}
